﻿Imports BU
Imports DAL

Public Class fCustomers



#Region "Khai báo biến"

    'Biến kiểm soát trạng thái của Record Customer đang hiển thị hiện hành
    'Các giá trị có thể: Select - New
    Private statusOfCustomerRecord As String

    'Biến kiểm soát trạng thái của Record Contact đang hiển thị hiện hành
    'Các giá trị có thể: Select - New
    Private statusOfContactRecord As String

    'Biến kiểm soát Panel làm việc hiện hành
    'Các giá trị có thể: Customer - Contact - Location
    Private currentPanel As String

#End Region



#Region "Dùng chung"

    
    ''' <summary>
    '''     EVENT - Thay đổi Panel theo Tab chức năng được chọn
    ''' </summary>
    Private Sub tcLeft_SelectedIndexChanged(sender As Object, e As EventArgs) Handles tcLeft.SelectedIndexChanged

        'FUNC: Kỹ thuật sử dụng sự kiện chuyển đổi Tabpage
        Select Case tcLeft.SelectedTab.Text
            Case "Tổng quát"

                'Panel Tổng quát
                pnlCustomer.Dock = DockStyle.Fill
                'pnlCustomer.Location = New Point(5000, 5000)

                'Panel Nhân sự
                pnlContact.Dock = DockStyle.None
                pnlContact.Location = New Point(5000, 5000)

                currentPanel = "Customer"

            Case "Nhân sự"

                'Panel Tổng quát
                pnlCustomer.Dock = DockStyle.None
                pnlCustomer.Location = New Point(5000, 5000)

                'Panel Nhân sự
                pnlContact.Dock = DockStyle.Fill
                'pnlContact.Location = New Point(5000, 5000)

                currentPanel = "Contact"

            Case "Trụ sở"


                currentPanel = "Location"
        End Select
    End Sub


    ''' <summary>
    '''     EVENT - fCustomers_Load
    ''' </summary>
    Private Sub fCustomers_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        'TỔNG QUÁT
        '----------------------------
        'Nạp danh sách CustomerIds
        Call LoadListOfCustomerIds()
        'Liên kết dữ liệu với grdCustomers
        Call BindingListOfCustomerIdsWithCompanyNameVIsToGrid()
        

        'NHÂN SỰ
        '----------------------------
        'Nạp danh sách ContactIds
        Call LoadListOfContactIds()
        
    End Sub


    ''' <summary>
    '''     EVENT - btnSave_Click : Lưu record vào CSDL
    ''' </summary>
    Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click

        UltraValidator.Validate()

        Select Case currentPanel
            Case "Customer"

                If Not ValidateCustomerControls() Then
                    Exit Sub
                End If

                If statusOfCustomerRecord.Equals("Select") Then
                    Call UpdateCustomer()
                ElseIf statusOfCustomerRecord.Equals("New") Then
                    Call InsertCustomer()

                End If

            Case "Contact"

                If Not ValidateContactControls() Then
                    Exit Sub
                End If

                If statusOfContactRecord.Equals("Select") Then
                    Call UpdateContact()
                ElseIf statusOfContactRecord.Equals("New") Then
                    Call InsertContact()

                End If

        End Select


    End Sub


    ''' <summary>
    '''     EVENT - btnNewRecord_Click
    ''' </summary>
    Private Sub btnNewRecord_Click(sender As Object, e As EventArgs) Handles btnNewRecord.Click

        Select Case currentPanel

            Case "Customer"
                Call ClearCustomerControls()
                statusOfCustomerRecord = "New"

            Case "Contact"
                Call ClearContactControls()
                statusOfContactRecord = "New"

        End Select

    End Sub


    ''' <summary>
    '''     EVENT - btnDelete_Click : Xóa hồ sơ khách hàng
    ''' </summary>
    Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click

        If Not String.IsNullOrWhiteSpace(cbxCustomerId.Text) Then
            Dim confirmation As DialogResult
            confirmation = MessageBox.Show("Bạn thực sự muốn xóa hồ sơ của " & tbxCompanyNameVI.Text & " không?",
                                           "Xác nhận thao tác...", MessageBoxButtons.YesNo, MessageBoxIcon.Question)

            If confirmation = DialogResult.Yes Then
                DeleteCustomerById(CInt(cbxCustomerId.Text))
            End If
        End If
    End Sub


#End Region



#Region "Tổng quát"


    ''' <summary>
    '''     PROCEDURE - Nạp danh sách CustomerIDs vào cbxCustomerIds
    ''' </summary>
    Private Sub LoadListOfCustomerIds()

        'FUNC: Kỹ thuật ForEach trong List(Of T) - Add Items vào ComboBox
        Dim obuCustomer As New buCustomers
        Dim listOfCustomerIds As List(Of Customer) = obuCustomer.RetrieveListOfCustomerIds()

        For Each customer As Customer In listOfCustomerIds
            cbxCustomerId.Items.Add(customer.CustomerId)
        Next
    End Sub


    ''' <summary>
    '''     PROCEDURE - Nạp thông tin Customer vào các Controls khi CustomerId được chọn
    ''' </summary>
    Private Sub LoadCustomerByCustomerID(ByVal customerId As Integer)
        Dim obuCustomer As New buCustomers
        Dim customer As New Customer

        'Thiết lập trạng thái của Record thành: SELECT
        statusOfCustomerRecord = "Select"
        customer = obuCustomer.RetrieveCustomerById(customerId)

        If customer Is Nothing Then
            Exit Sub
        End If

        cbxType.Text = customer.Type
        cbxZType.Text = customer.ZType
        tbxCompanyNameVI.Text = customer.CustomerNameVI
        tbxCompanyNameEN.Text = customer.CustomerNameEN
        cbxIndustrialField.Text = customer.IndustrialField

        If Not String.IsNullOrWhiteSpace(customer.Note) Then
            tbxNote.Text = customer.Note
        Else
            tbxNote.Text = String.Empty
        End If
    End Sub


    ''' <summary>
    '''     FUNCTION - Lấy thông tin khách hàng từ các Controls
    ''' </summary>
    Private Function ReflectControlsToCustomer() As Customer
        Dim customer As New Customer

        'Lấy thông tin từ các Controls
        If Not String.IsNullOrWhiteSpace(cbxCustomerId.Text) Then
            customer.CustomerId = cbxCustomerId.Text
        End If

        customer.Type = cbxType.Text
        customer.ZType = cbxZType.Text
        customer.CustomerNameVI = tbxCompanyNameVI.Text
        customer.CustomerNameEN = tbxCompanyNameEN.Text
        customer.IndustrialField = cbxIndustrialField.Text

        If Not String.IsNullOrWhiteSpace(tbxNote.Text) Then
            customer.Note = tbxNote.Text
        Else
            customer.Note = String.Empty
        End If

        Return customer
    End Function


    ''' <summary>
    '''     PROCEDURE - Cập nhật thông tin khách hàng
    ''' </summary>
    Private Sub UpdateCustomer()

        Dim obuCustomer As New buCustomers
        If obuCustomer.UpdateCustomerById(ReflectControlsToCustomer()) Then
            MessageBox.Show("Lưu thành công.")

            'Nạp lại grdCustomer
            Call BindingListOfCustomerIdsWithCompanyNameVIsToGrid()

        Else
            MessageBox.Show("Lưu thất bại...!")
        End If
    End Sub


    ''' <summary>
    '''     PROCEDURE - Lưu một record khách hàng mới vào CSDL
    ''' </summary>
    Private Sub InsertCustomer()

        Dim obuCustomer As New buCustomers
        If obuCustomer.InsertNewCustomer(ReflectControlsToCustomer()) Then
            MessageBox.Show("Lưu thành công.")
            'Trạng thái Record trở lại SELECT
            statusOfCustomerRecord = "Select"
            'Nạp lại danh sách CustomerIds
            Call LoadListOfCustomerIds()

            'Nạp lại grdCustomer
            Call BindingListOfCustomerIdsWithCompanyNameVIsToGrid()


            cbxCustomerId.SelectedIndex = cbxCustomerId.Items.Count - 1
        Else
            MessageBox.Show("Lưu thất bại...!")
        End If
    End Sub


    ''' <summary>
    '''     PROCEDURE - Xóa trắng các Controls
    ''' </summary>
    Private Sub ClearCustomerControls()

        cbxCustomerId.SelectedIndex = -1
        cbxType.SelectedIndex = -1
        cbxZType.SelectedIndex = -1
        tbxCompanyNameVI.Text = String.Empty
        tbxCompanyNameEN.Text = String.Empty
        cbxIndustrialField.SelectedIndex = -1
        tbxNote.Text = String.Empty
    End Sub


    ''' <summary>
    '''     FUNCTION - Kiểm tra các Controls bắt buộc đã có đủ thông tin
    ''' </summary>
    Private Function ValidateCustomerControls() As Boolean

        If String.IsNullOrWhiteSpace(cbxType.Text) Or
           String.IsNullOrWhiteSpace(cbxZType.Text) Or
           String.IsNullOrWhiteSpace(tbxCompanyNameVI.Text) Or
           String.IsNullOrWhiteSpace(tbxCompanyNameEN.Text) Or
           String.IsNullOrWhiteSpace(cbxIndustrialField.Text) Then

            MessageBox.Show("Thông tin cung cấp chưa đầy đủ." & vbCrLf & "Vui lòng kiểm tra lại và bổ sung",
                            "Lỗi người sử dụng", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Return False

        Else
            Return True
        End If
    End Function


    ''' <summary>
    '''     PROCEDURE - Xóa record một khách hàng khỏi CSDL
    ''' </summary>
    Private Sub DeleteCustomerById(ByVal customerId As Integer)
        Dim obuCustomer As New buCustomers

        Dim companyName As String = tbxCompanyNameVI.Text

        If obuCustomer.DeleteCustomerById(customerId) Then
            MessageBox.Show("Xóa thành công.", "Xóa hồ sơ " & companyName, MessageBoxButtons.OK,
                            MessageBoxIcon.Information)

            'Nạp lại danh sách CustomerIds
            Call LoadListOfCustomerIds()
            'Nạp lại grdCustomer
            Call BindingListOfCustomerIdsWithCompanyNameVIsToGrid()


            cbxCustomerId.SelectedIndex = cbxCustomerId.Items.Count - 1

        Else
            MessageBox.Show("Xóa thất bại...", "Xóa hồ sơ " & companyName, MessageBoxButtons.OK,
                            MessageBoxIcon.Information)
        End If
    End Sub


    ''' <summary>
    '''     PROCEDURE - Liên kết dữ liệu CustomerIds + CompanyNameVI
    ''' </summary>
    Private Sub BindingListOfCustomerIdsWithCompanyNameVIsToGrid()

        'Khai báo một DataTable để chứa dữ liệu
        Dim dtSource As New DataTable("Customers")

        'Khai báo một biến đối tượng DataColumn
        Dim dcCustomer As New DataColumn("CustomerID", GetType(Int32))

        'Thêm cột CustomerId vào DataTable
        dcCustomer.Caption = "ID"
        dtSource.Columns.Add(dcCustomer)

        'Thêm cột CompanyNameVI
        dcCustomer = New DataColumn("CompanyNameVI", GetType(String))
        dcCustomer.MaxLength = 512
        dcCustomer.Caption = "Tên khách hàng"
        dtSource.Columns.Add(dcCustomer)

        'Khai báo một biến đối tượng DataRow
        Dim drCustomer As DataRow

        Dim obuCustomer As New buCustomers
        Dim listOfCustomerIdsWithCompanyNameVI As List(Of Customer) =
                obuCustomer.RetrieveListOfCustomerIdsAndCompanyNameVIs()


        For Each customer As Customer In listOfCustomerIdsWithCompanyNameVI
            drCustomer = dtSource.NewRow()
            drCustomer("CustomerID") = customer.CustomerId
            drCustomer("CompanyNameVI") = customer.CustomerNameVI
            dtSource.Rows.Add(drCustomer)
        Next

        'Liên kết với Grid Customers
        grdCustomers.DataSource = dtSource

        'FUNC: Kỹ thuật kết nối UltraGrid với các Controls
        'Liên kết Grid Customers với cbxCustomerId
        cbxCustomerId.DataBindings.Clear()
        cbxCustomerId.DataBindings.Add("Text", grdCustomers.DataSource, "CustomerId")

        'FUNC: Kỹ thuật sử dụng UltraCombo nhiều cột
        'Liên kết với ComboBox Customers của Panel Contact
        cbxContact_CustomerId.DataSource = dtSource
    End Sub


    ''' <summary>
    '''     EVENT - cbxCustomerId_SelectedIndexChanged
    ''' </summary>
    Private Sub cbxCustomerId_SelectedIndexChanged(sender As Object, e As EventArgs) _
        Handles cbxCustomerId.SelectedIndexChanged

        If Not String.IsNullOrWhiteSpace(cbxCustomerId.Text) Then
            Call LoadCustomerByCustomerID(CInt(cbxCustomerId.Text))

            'Liên kết cbxContactId với cbxContact_CustomerId
            cbxContact_CustomerId.Text = cbxCustomerId.Text
        End If
    End Sub

    
#End Region


#Region "Nhân sự"

    
    ''' <summary>
    '''     PROCEDURE - Nạp danh sách ContactIds vào cbxContactIds
    ''' </summary>
    Private Sub LoadListOfContactIds()

        Dim obuContact As New buContacts
        Dim listOfContactIds As List(Of Contact) = obuContact.RetrieveListOfContactIds()

        For Each contact As Contact In listOfContactIds
            cbxContactId.Items.Add(contact.ContactId)
        Next
    End Sub

    
    ''' <summary>
    '''     PROCEDURE - Liên kết dữ liệu ContactId + Name
    ''' </summary>
    Private Sub BindingListOfContactIdsWithNameToGrid(ByVal customerId As Integer)

        'Khai báo một DataTable để chứa dữ liệu
        Dim dtSource As New DataTable("Contacts")

        'Khai báo một biến đối tượng DataColumn
        Dim dcContact As New DataColumn("ContactId", GetType(Int32))

        'Thêm cột ContactId vào DataTable
        dcContact.Caption = "ID"
        dtSource.Columns.Add(dcContact)

        'Thêm cột Name
        dcContact = New DataColumn("Name", GetType(String))
        dcContact.MaxLength = 512
        dcContact.Caption = "Họ tên"
        dtSource.Columns.Add(dcContact)

        'Khai báo một biến đối tượng DataRow
        Dim drContact As DataRow

        Dim obuContact As New buContacts
        Dim ListOfContactIdsWithName As List(Of Contact) = obuContact.RetrieveContactsByCustomerId(customerId)

        For Each contact As Contact In ListOfContactIdsWithName
            drContact = dtSource.NewRow()
            drContact("ContactId") = contact.ContactId
            drContact("Name") = contact.Name
            dtSource.Rows.Add(drContact)
        Next

        'Liên kết với Grid Contacts
        grdContacts.DataSource = dtSource

    End Sub


    ''' <summary>
    '''     FUNCTION - Ghi nhận thông tin từ các Controls thành đối tượng Contact
    ''' </summary>
    Private Function ReflectControlsToContact() As Contact

        Dim contact As New Contact

        If Not String.IsNullOrWhiteSpace(cbxContactId.Text) Then
            contact.ContactId = cbxContactId.Text
        End If

        contact.CustomerId = cbxContact_CustomerId.Text
        contact.Title = cbxTitle.Text
        contact.Name = tbxName.Text

        'Chức vụ
        If Not String.IsNullOrWhiteSpace(cbxJobTitle.Text) Then
            contact.JobTitle = cbxJobTitle.Text
        Else
            contact.JobTitle = String.Empty
        End If

        'Bộ phận
        If Not String.IsNullOrWhiteSpace(cbxDepartment.Text) Then
            contact.Department = cbxDepartment.Text
        Else
            contact.Department = String.Empty
        End If

        'Điện thoại
        If Not String.IsNullOrWhiteSpace(tbxTelephone.Text) Then
            contact.Telephone = tbxTelephone.Text
        Else
            contact.Telephone = String.Empty
        End If

        'Di động
        If Not String.IsNullOrWhiteSpace(tbxMobile.Text) Then
            contact.Mobile = tbxMobile.Text
        Else
            contact.Mobile = String.Empty
        End If

        'Email
        If Not String.IsNullOrWhiteSpace(tbxEmail.Text) Then
            contact.Email = tbxEmail.Text
        Else
            contact.Email = String.Empty
        End If

        'Ghi chú
        If Not String.IsNullOrWhiteSpace(tbxContactNote.Text) Then
            contact.Note = tbxContactNote.Text
        Else
            contact.Note = String.Empty
        End If

        Return contact

    End Function

    
    ''' <summary>
    '''     PROCEDURE - Thể hiện thông tin Contact lên các Controls
    ''' </summary>
    ''' <param name="contactId">ID Contact muốn thể hiện</param>
    Private Sub ReflectContactToControls(ByVal contactId As Integer)

        Dim obuContact As New buContacts
        Dim contact As New Contact

        contact = obuContact.RetrieveContactById(contactId)

        cbxContact_CustomerId.Text = contact.CustomerId
        cbxContactId.Text = contact.ContactId
        cbxTitle.Text = contact.Title
        tbxName.Text = contact.Name

        'Chức vụ
        If Not String.IsNullOrWhiteSpace(contact.JobTitle) Then
            cbxJobTitle.Text = contact.JobTitle
        Else
            cbxJobTitle.Text = String.Empty
        End If

        'Bộ phận
        If String.IsNullOrWhiteSpace(contact.Department) Then
            cbxDepartment.Text = contact.Department
        Else
            cbxDepartment.Text = String.Empty
        End If

        'Điện thoại
        If Not String.IsNullOrWhiteSpace(contact.Telephone) Then
            tbxTelephone.Text = contact.Telephone
        Else
            tbxTelephone.Text = String.Empty
        End If

        'Di động
        If Not String.IsNullOrWhiteSpace(contact.Mobile) Then
            tbxMobile.Text = contact.Mobile
        Else
            tbxMobile.Text = String.Empty
        End If

        'Email
        If Not String.IsNullOrWhiteSpace(contact.Email) Then
            tbxEmail.Text = contact.Email
        Else
            tbxEmail.Text = String.Empty
        End If

        'Ghi chú
        If Not String.IsNullOrWhiteSpace(contact.Note) Then
            tbxContactNote.Text = contact.Note
        Else
            tbxContactNote.Text = String.Empty
        End If
    End Sub


    ''' <summary>
    '''     PROCEDURE - Cập nhật thông tin liên hệ
    ''' </summary>
    Private Sub UpdateContact()

        Dim obuContact As New buContacts
        If obuContact.UpdateContactById(ReflectControlsToContact()) Then
            MessageBox.Show("Lưu thành công.")
        Else
            MessageBox.Show("Lưu thất bại...!")
        End If
    End Sub


    ''' <summary>
    ''' PROCEDURE - Xóa trắng các Contact Controls
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub ClearContactControls()
        
        'cbxContact_CustomerId.Text = String.Empty
        cbxContactId.Text = String.Empty
        cbxTitle.Text = String.Empty
        tbxName.Text = String.Empty
        cbxJobTitle.Text = String.Empty
        cbxDepartment.Text = String.Empty
        tbxTelephone.Text = String.Empty
        tbxMobile.Text = String.Empty
        tbxEmail.Text = String.Empty
        tbxNote.Text = String.Empty
        
    End Sub

    
    ''' <summary>
    '''     FUNCTION - Kiểm tra các Controls bắt buộc đã có đủ thông tin
    ''' </summary>
    Private Function ValidateContactControls() As Boolean

        If String.IsNullOrWhiteSpace(cbxContact_CustomerId.Text) Or
           String.IsNullOrWhiteSpace(cbxTitle.Text) Or
           String.IsNullOrWhiteSpace(tbxName.Text) Then

            MessageBox.Show("Thông tin cung cấp chưa đầy đủ." & vbCrLf & "Vui lòng kiểm tra lại và bổ sung",
                            "Lỗi người sử dụng", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Return False

        Else
            Return True
        End If
    End Function


    ''' <summary>
    '''     PROCEDURE - Lưu một record Contact mới vào CSDL
    ''' </summary>
    Private Sub InsertContact()

        Dim obuContact As New buContacts
        If obuContact.InsertNewContact(ReflectControlsToContact()) Then
            MessageBox.Show("Lưu thành công.")
            'Trạng thái Record trở lại SELECT
            statusOfCustomerRecord = "Select"
            'Nạp lại danh sách CustomerIds
            Call LoadListOfContactIds()
            'Nạp lại grdContacts
            If Not String.IsNullOrWhiteSpace(cbxContact_CustomerId.Text) Then
                Call BindingListOfContactIdsWithNameToGrid(CInt(cbxContact_CustomerId.Text))
            End If


            cbxContactId.SelectedIndex = cbxContactId.Items.Count - 1
        Else
            MessageBox.Show("Lưu thất bại...!")
        End If
    End Sub


    ''' <summary>
    '''     EVENT - cbxContact_CustomerId_ValueChanged
    ''' </summary>
    Private Sub cbxContact_CustomerId_ValueChanged(sender As Object, e As EventArgs) _
        Handles cbxContact_CustomerId.ValueChanged
        If Not String.IsNullOrWhiteSpace(cbxContact_CustomerId.Text) Then
            Call BindingListOfContactIdsWithNameToGrid(CInt(cbxContact_CustomerId.Text))

            'Liên kết cbxContactId với cbxContact_CustomerId
            cbxCustomerId.Text = cbxContact_CustomerId.Text

            cbxContactId.DataBindings.Clear()
            cbxContactId.DataBindings.Add("Text", grdContacts.DataSource, "ContactId")
        End If
    End Sub

    
    ''' <summary>
    '''     EVENT - cbxContactId_SelectedIndexChanged
    ''' </summary>
    Private Sub cbxContactId_SelectedIndexChanged(sender As Object, e As EventArgs) _
        Handles cbxContactId.SelectedIndexChanged
        If Not String.IsNullOrWhiteSpace(cbxContactId.Text) Then
            Call ReflectContactToControls(CInt(cbxContactId.Text))

            statusOfContactRecord = "Select"
        End If
    End Sub


#End Region

    
End Class